Fix GtkShortcutsWindow crash
authorMatthias Clasen <mclasen@redhat.com>
Thu, 21 Jan 2016 00:33:16 +0000 (19:33 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 21 Jan 2016 00:33:16 +0000 (19:33 -0500)
GtkShortcutsWindow is among the 'cheating' containers that iterate
over indirect children in forall, and this is now triggering
an assertion in gtk_container_propagate_draw.

For now, just exclude the cheating containers from the assertion.
Eventually, this needs a better solution.

gtk/gtkcontainer.c

index 090b4d71004fb34392b2558b9c7bf2ee86343543..1df06adb4e4ed07892a6497fac827c483a61c79f 100644 (file)
 #include "gtkpopovermenu.h"
 #include "gtkshortcutswindow.h"
 
+/* A handful of containers inside GTK+ are cheating and widgets
+ * inside internal structure as direct children for the purpose
+ * of forall().
+ */
+#define SPECIAL_CONTAINER(x) (GTK_IS_ASSISTANT (x) || \
+                              GTK_IS_ACTION_BAR (x) || \
+                              GTK_IS_POPOVER_MENU (x) || \
+                              GTK_IS_SHORTCUTS_SECTION (x) || \
+                              GTK_IS_SHORTCUTS_WINDOW (x))
+
 /**
  * SECTION:gtkcontainer
  * @Short_description: Base class for widgets which contain other widgets
@@ -661,9 +671,7 @@ gtk_container_buildable_set_child_property (GtkContainer *container,
   GObjectNotifyQueue *nqueue;
 
   if (_gtk_widget_get_parent (child) != (GtkWidget *)container &&
-      !GTK_IS_ASSISTANT (container) &&
-      !GTK_IS_ACTION_BAR (container) &&
-      !GTK_IS_POPOVER_MENU (container))
+      !SPECIAL_CONTAINER (container))
     {
       /* This can happen with internal children of complex widgets.
        * Silently ignore the child properties in this case. We explicitly
@@ -3749,7 +3757,8 @@ gtk_container_propagate_draw (GtkContainer *container,
   g_return_if_fail (GTK_IS_WIDGET (child));
   g_return_if_fail (cr != NULL);
 
-  g_assert (_gtk_widget_get_parent (child) == GTK_WIDGET (container));
+  g_assert (_gtk_widget_get_parent (child) == GTK_WIDGET (container) ||
+            SPECIAL_CONTAINER (container));
 
   if (!gtk_container_should_propagate_draw (container, child, cr))
     return;